package com.tianji.aigc.config;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 工具结果保持器，用来存储tools中得到的结果，请求id 作为key， value为键值对数据
 */
public class ToolResultHolder {

    // 使用ConcurrentHashMap存储工具执行结果，线程安全
    // 结构：Map<请求ID, Map<字段名, 字段值>>
    private static final Map<String, Map<String, Object>> HANDLER_MAP = new ConcurrentHashMap<>();

    // 私有构造函数，防止实例化该类（工具类模式）
    private ToolResultHolder() {
    }

    /**
     * 存储工具执行结果
     * @param key 请求ID，用于标识一次完整的请求
     * @param field 字段名，标识具体的工具执行结果
     * @param result 工具执行结果对象
     */
    public static void put(String key, String field, Object result) {
        // 参数校验，避免空指针异常
        if (null == key || null == field) {
            return;
        }
        // 使用computeIfAbsent确保线程安全：
        // 如果key不存在，则创建一个新的HashMap并放入HANDLER_MAP
        // 然后将field和result存入该HashMap中
        HANDLER_MAP.computeIfAbsent(key, k -> new HashMap<>()).put(field, result);
    }

    /**
     * 根据请求ID获取所有工具执行结果
     * @param key 请求ID
     * @return 该请求ID对应的所有工具执行结果Map
     */
    public static Map<String, Object> get(String key) {
        // 直接返回请求ID对应的Map，如果不存在则返回null
        return key == null ? null : HANDLER_MAP.get(key);
    }

    /**
     * 根据请求ID和字段名获取特定的工具执行结果
     * @param key 请求ID
     * @param field 字段名
     * @return 特定的工具执行结果
     */
    public static Object get(String key, String field) {
        // 参数校验
        if (null == key || null == field) {
            return null;
        }
        // 使用Optional链式操作安全获取结果：
        // 1. 先获取请求ID对应的Map
        // 2. 如果Map存在，则从中获取字段对应的值
        // 3. 如果任何一步为null，则返回null
        return Optional.ofNullable(HANDLER_MAP.get(key))
                .map(map -> map.get(field))
                .orElse(null);
    }

    /**
     * 根据请求ID删除对应的工具执行结果
     * @param key 请求ID
     */
    public static void remove(String key) {
        // 参数校验
        if (null == key) {
            return;
        }
        // 从HANDLER_MAP中移除该请求ID对应的所有数据
        HANDLER_MAP.remove(key);
    }
}